home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / hamradio / sgp4_pl2.zip / SGP_TIME.PAS < prev    next >
Pascal/Delphi Source File  |  1992-09-28  |  6KB  |  207 lines

  1. Unit SGP_Time;
  2. {           Author:  Dr TS Kelso }
  3. { Original Version:  1992 Jun 02 }
  4. { Current Revision:  1992 Sep 28 }
  5. {          Version:  1.50 }
  6. {        Copyright:  1992, All Rights Reserved }
  7. {$N+}
  8.  
  9. INTERFACE
  10.   Uses SGP_Math;
  11.  
  12. type
  13.   clock_time = string[12];
  14.   date       = string[11];
  15.  
  16. const
  17.   xmnpda   =  1440.0;        {Minutes per day}
  18.   secday   = 86400.0;        {Seconds per day}
  19.   omega_E  = 1.00273790934;  {Earth rotations per sidereal day (non-constant)}
  20.   omega_ER = omega_E*twopi;  {Earth rotation, radians per sidereal day}
  21.  
  22. var
  23.   ds50 : double;
  24.  
  25. Function Julian_Date_of_Year(year : double) : double;
  26. Function Julian_Date_of_Epoch(epoch : double) : double;
  27. Function Epoch_Time(jd : double) : double;
  28. Function DOY(yr,mo,dy : word) : word;
  29. Function Fraction_of_Day(hr,mi,se,hu : word) : double;
  30. Function Calendar_Date(jd : double) : date;
  31. Function Time_of_Day(jd : double;
  32.                    full : boolean;
  33.                     res : byte) : clock_time;
  34. Function ThetaG(epoch : double) : double;
  35. Function ThetaG_JD(jd : double) : double;
  36. Function Delta_ET(year : double) : double;
  37.  
  38. IMPLEMENTATION
  39.   Uses MinMax,Support;
  40.  
  41. const
  42.   half_sec = 0.5/secday;
  43.  
  44. Function Julian_Date_of_Year(year : double) : double;
  45.   { Astronomical Formulae for Calculators, Jean Meeus, pages 23-25 }
  46.   { Calculate Julian Date of 0.0 Jan year }
  47.   var
  48.     A,B   : longint;
  49.   begin
  50.   year := year - 1;
  51.   A := Trunc(year/100);
  52.   B := 2 - A + Trunc(A/4);
  53.   Julian_Date_of_Year := Trunc(365.25 * year)
  54.                        + Trunc(30.6001 * 14)
  55.                        + 1720994.5 + B;
  56.   end; {Function Julian_Date_of_Year}
  57.  
  58. Function Julian_Date_of_Epoch(epoch : double) : double;
  59.   var
  60.     year,day : double;
  61.   begin
  62.   year := 1900 + Int(epoch*1E-3);
  63.   day  := Frac(epoch*1E-3)*1E3;
  64.   Julian_Date_of_Epoch := Julian_Date_of_Year(year) + day;
  65.   end; {Function Julian_Date_of_Epoch}
  66.  
  67. Function Epoch_Time(jd : double) : double;
  68.   var
  69.     year,mo,dy    : word;
  70.     yr,time,epoch : double;
  71.     edate         : date;
  72.   begin
  73.   edate := Calendar_Date(jd);
  74.   year := Integer_Value(edate,1,4);
  75.   yr := Integer_Value(edate,3,2);
  76.   mo := Pos(Copy(edate,6,3),'  JanFebMarAprMayJunJulAugSepOctNovDec') div 3;
  77.   dy := Integer_Value(edate,10,2);
  78.   time := Frac(jd + 0.5);
  79.   Epoch_Time := yr*1000 + DOY(year,mo,dy) + time;
  80.   end; {Function Epoch_Time}
  81.  
  82. Function DOY(yr,mo,dy : word) : word;
  83.   const
  84.     days : array [1..12] of word = (31,28,31,30,31,30,31,31,30,31,30,31);
  85.   var
  86.     i,day : word;
  87.   begin
  88.   day := 0;
  89.   for i := 1 to mo-1 do
  90.     day := day + days[i];
  91.   day := day + dy;
  92.   if ((yr mod 4) = 0) and
  93.      (((yr mod 100) <> 0) or ((yr mod 400) = 0)) and
  94.      (mo > 2) then
  95.     day := day + 1;
  96.   DOY := day;
  97.   end; {Function DOY}
  98.  
  99. Function Fraction_of_Day(hr,mi,se,hu : word) : double;
  100.   begin
  101.   Fraction_of_Day := (hr + (mi + (se + hu/100)/60)/60)/24;
  102.   end; {Function Fraction_of_Day}
  103.  
  104. Function Calendar_Date(jd : double) : date;
  105.   { Astronomical Formulae for Calculators, Jean Meeus, pages 26-27 }
  106.   var
  107.     Z,month           : longint;
  108.     A,B,C,D,E,F,alpha : double;
  109.     day,year          : double;
  110.     syear             : string[4];
  111.     cdate             : date;
  112.   begin
  113.   Z := Trunc(jd + 0.5);
  114.   F := Frac(jd + 0.5);
  115.   if Z < 2299161 then
  116.     A := Z
  117.   else
  118.     begin
  119.     alpha := Int((Z - 1867216.25)/36524.25);
  120.     A := Z + 1 + alpha - Int(alpha/4);
  121.     end; {else}
  122.   B := A + 1524;
  123.   C := Int((B - 122.1)/365.25);
  124.   D := Int(365.25 * C);
  125.   E := Int((B - D)/30.6001);
  126.   day := B - D - Int(30.6001 * E) + F;
  127.   if E < 13.5 then
  128.     month := Round(E - 1)
  129.   else
  130.     month := Round(E - 13);
  131.   if month > 2.5 then
  132.     year := C - 4716
  133.   else
  134.     year := C - 4715;
  135.   Str(year:4:0,syear);
  136.   cdate := syear + ' '
  137.          + Copy('  JanFebMarAprMayJunJulAugSepOctNovDec',3*month,3) + ' '
  138.          + TwoDigit(Trunc(day));
  139.   Calendar_Date := cdate;
  140.   end; {Function Calendar_Date}
  141.  
  142. Function Time_of_Day(jd : double;
  143.                    full : boolean;
  144.                     res : byte) : clock_time;
  145.   var
  146.     hr,mn   : longint;
  147.     time,sc : double;
  148.     ctime   : string;
  149.   begin
  150.   res := IMin(IMax(0,res),3);
  151.   time := 24 * Frac(jd - 0.5 + half_sec);
  152.   hr   := Trunc(time);
  153.   time := 60 * Frac(time);
  154.   mn   := Trunc(time);
  155.   sc   := 60 * Frac(time) - 0.5;
  156.   time := 1000000 + 10000 * hr + 100 * mn + sc;
  157.   Str(time:(7+res):res,ctime);
  158.   Delete(ctime,1,1);
  159.   if full then
  160.     begin
  161.     Insert(':',ctime,5);
  162.     Insert(':',ctime,3);
  163.     end; {if}
  164.   Time_of_Day := ctime;
  165.   end; {Function Time_of_Day}
  166.  
  167. Function ThetaG(epoch : double) : double;
  168. { Reference:  The 1992 Astronomical Almanac, page B6. }
  169.   var
  170.     year,day,UT,jd,TU,GMST : double;
  171.   begin
  172.   year := 1900 + Int(epoch*1E-3);
  173.   day  := Frac(epoch*1E-3)*1E3;
  174.   UT   := Frac(day);
  175.   day  := Int(day);
  176.   jd   := Julian_Date_of_Year(year) + day;
  177.   TU   := (jd - 2451545.0)/36525;
  178.   GMST := 24110.54841 + TU * (8640184.812866 + TU * (0.093104 - TU * 6.2E-6));
  179.   GMST := Modulus(GMST + secday*omega_E*UT,secday);
  180.   ThetaG := twopi * GMST/secday;
  181.   ds50 := jd - 2433281.5 + UT;
  182. { ThetaG := Modulus(6.3003880987*ds50 + 1.72944494,twopi); }
  183.   end; {Function ThetaG}
  184.  
  185. Function ThetaG_JD(jd : double) : double;
  186. { Reference:  The 1992 Astronomical Almanac, page B6. }
  187.   var
  188.     UT,TU,GMST : double;
  189.   begin
  190.   UT   := Frac(jd + 0.5);
  191.   jd   := jd - UT;
  192.   TU   := (jd - 2451545.0)/36525;
  193.   GMST := 24110.54841 + TU * (8640184.812866 + TU * (0.093104 - TU * 6.2E-6));
  194.   GMST := Modulus(GMST + secday*omega_E*UT,secday);
  195.   ThetaG_JD := twopi * GMST/secday;
  196.   end; {Function ThetaG_JD}
  197.  
  198. Function Delta_ET(year : double) : double;
  199.   { Values determined using data from 1950-1991 in the 1990 Astronomical
  200.     Almanac.  See DELTA_ET.WQ1 for details. }
  201.   begin
  202.   Delta_ET := 26.465 + 0.747622*(year - 1950)
  203.              + 1.886913*Sin(twopi*(year - 1975)/33);
  204.   end; {Function Delta_ET}
  205.  
  206. end.
  207.